package com.espoir.shp.read02;

import org.opengis.referencing.FactoryException;
import org.opengis.referencing.operation.TransformException;

import java.io.IOException;
import java.util.List;

public class App {
    public static void main(String[] args) {
    }
    public static void writeShp(List<Point> points, String filePath) {

        //Shapefile sf1 = new Shapefile("D:\\测试\\ceshi_shp");

        Shapefile sf = new Shapefile();
        sf.setType(5);

        TableDescriptor tableDescriptor = new TableDescriptor("中文字段");
        tableDescriptor.setWidth(50);
        TableDescription tableDescription = new TableDescription();
        tableDescription.addTableDescriptor(tableDescriptor);
        sf.setTableDescription(tableDescription);

        Record rd = new Record();

        RecordField rf = new RecordField();
        rf.setName("中文字段");
        rf.setValue("中文属性");

        rd.addField(rf);

        ShapeObject so = new ShapeObject(5);
        so.setRecord(rd);

        points.forEach(so::addPoint);
//        Point pt0 = new Point(1,1);
//        Point pt1 = new Point(0,0);
//        Point pt2 = new Point(0,1);
//
//        so.addPoint(pt0);
//        so.addPoint(pt1);
//        so.addPoint(pt2);
//        so.addPoint(pt0);

        sf.addShapeObject(so);

        try {
            sf.write(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void writeShp1(List<Point> points, String filePath) {
        System.out.println( "开始写入文件 --------------------------------------" );

        //Shapefile sf1 = new Shapefile("D:\\测试\\ceshi_shp");

        Shapefile sf = new Shapefile();
        sf.setType(5);

        // 一个字段
        TableDescriptor tableDescriptor = new TableDescriptor("name");
        tableDescriptor.setWidth(50);

        // 表的所有字段
        TableDescription tableDescription = new TableDescription();
        tableDescription.addTableDescriptor(tableDescriptor);

        // 给 shapefile 添加字段
        sf.setTableDescription(tableDescription);

        // 一条记录
        Record rd = new Record();
        // 一条记录中一个字段对应的值
        RecordField rf = new RecordField();
        rf.setName("name");
        rf.setValue("value");

        // 给一条记录添加一个字段
        rd.addField(rf);

        ShapeObject so = new ShapeObject(5);
        so.setRecord(rd);

        points.forEach(so::addPoint);
        //Point pt0 = new Point(1,1);
        //Point pt1 = new Point(0,0);
        //Point pt2 = new Point(0,1);
        //
        //so.addPoint(pt0);
        //so.addPoint(pt1);
        //so.addPoint(pt2);
        //so.addPoint(pt0);

        sf.addShapeObject(so);

        try {
            //String filePath = "D:\\resource\\sjdata\\test\\test444";
            sf.write(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void test01() throws FactoryException, TransformException, IOException {
        System.out.println("开始构建文件");
        Shapefile sf = new Shapefile();
        sf.setType(5);
        TableDescription tableDescription = new TableDescription();

        TableDescriptor tableDescriptor1 = new TableDescriptor("图斑编码");
        tableDescriptor1.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor1);

        TableDescriptor tableDescriptor2 = new TableDescriptor("措施代码");
        tableDescriptor2.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor2);

        TableDescriptor tableDescriptor3 = new TableDescriptor("措施名称");
        tableDescriptor3.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor3);

        TableDescriptor tableDescriptor4 = new TableDescriptor("利用现状");
        tableDescriptor4.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor4);

        TableDescriptor tableDescriptor5 = new TableDescriptor("措施数量");
        tableDescriptor5.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor5);

        TableDescriptor tableDescriptor6 = new TableDescriptor("坡度");
        tableDescriptor5.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor6);

        sf.setTableDescription(tableDescription);

//        for (Zdesignpolygon polygon : temp) {
//
//            Record rd = new Record();
//            RecordField rf1 = new RecordField();
//            rf1.setName("图斑编码");
//            rf1.setValue(polygon.getCode());
//            rd.addField(rf1);
//
//            RecordField rf2 = new RecordField();
//            rf2.setName("措施代码");
//            rf2.setValue(polygon.getMark());
//            rd.addField(rf2);
//
//            RecordField rf3 = new RecordField();
//            rf3.setName("措施名称");
//            rf3.setValue(polygon.getName());
//            rd.addField(rf3);
//
//            RecordField rf4 = new RecordField();
//            rf4.setName("利用现状");
//            rf4.setValue(polygon.getState());
//            rd.addField(rf4);
//
//            RecordField rf5 = new RecordField();
//            rf5.setName("措施数量");
//            rf5.setValue(polygon.getNumber().toString());
//            rd.addField(rf5);
//
//            RecordField rf6 = new RecordField();
//            rf6.setName("坡度");
//            rf6.setValue(polygon.getSlope().toString());
//            rd.addField(rf6);
//
//            ShapeObject so = new ShapeObject(5);
//            so.setRecord(rd);
//
//            CoordinateUitls.WGS84ToAlbers(polygon.getCoordinate());
//            GeometryJSON geometryJSON2 = new GeometryJSON(15);//?15
//            Geometry geometry = geometryJSON2.read(new StringReader(polygon.getCoordinate()));
//
//            org.locationtech.jts.geom.Coordinate[] coords = geometry.getCoordinates();
//            for (int i = 0; i < coords.length; i++) {
//                Point pt0 = new Point(coords[i].x, coords[i].y);
//                so.addPoint(pt0);
//            }
//            sf.addShapeObject(so);
//        }

        String writePath = "D:\\test\\testShp";
        sf.write(writePath);//创建shx shp dbf
        System.out.println("写入成功");
    }

    private static void test00() {
        System.out.println( "开始写入文件 --------------------------------------" );

        //Shapefile sf1 = new Shapefile("D:\\测试\\ceshi_shp");

        Shapefile sf = new Shapefile();
        sf.setType(5);

        TableDescriptor tableDescriptor = new TableDescriptor("中文字段");
        tableDescriptor.setWidth(50);
        TableDescription tableDescription = new TableDescription();
        tableDescription.addTableDescriptor(tableDescriptor);
        sf.setTableDescription(tableDescription);

        Record rd = new Record();

        RecordField rf = new RecordField();
        rf.setName("中文字段");
        rf.setValue("中文属性");

        rd.addField(rf);

        ShapeObject so = new ShapeObject(5);
        so.setRecord(rd);
        Point pt0 = new Point(1,1);
        Point pt1 = new Point(0,0);
        Point pt2 = new Point(0,1);

        so.addPoint(pt0);
        so.addPoint(pt1);
        so.addPoint(pt2);
        so.addPoint(pt0);

        sf.addShapeObject(so);

        try {
            sf.write("D:\\test\\ceshi_shp");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void test02() throws FactoryException, TransformException, IOException {
        System.out.println("开始构建文件");
        Shapefile sf = new Shapefile();
        sf.setType(5);
        TableDescription tableDescription = new TableDescription();

        TableDescriptor tableDescriptor1 = new TableDescriptor("图斑编码");
        tableDescriptor1.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor1);

        TableDescriptor tableDescriptor2 = new TableDescriptor("措施代码");
        tableDescriptor2.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor2);

        TableDescriptor tableDescriptor3 = new TableDescriptor("措施名称");
        tableDescriptor3.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor3);

        TableDescriptor tableDescriptor4 = new TableDescriptor("利用现状");
        tableDescriptor4.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor4);

        TableDescriptor tableDescriptor5 = new TableDescriptor("措施数量");
        tableDescriptor5.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor5);

        TableDescriptor tableDescriptor6 = new TableDescriptor("坡度");
        tableDescriptor5.setWidth(50);
        tableDescription.addTableDescriptor(tableDescriptor6);

        sf.setTableDescription(tableDescription);

//        for (Zdesignpolygon polygon : temp) {
//
//            Record rd = new Record();
//            RecordField rf1 = new RecordField();
//            rf1.setName("图斑编码");
//            rf1.setValue(polygon.getCode());
//            rd.addField(rf1);
//
//            RecordField rf2 = new RecordField();
//            rf2.setName("措施代码");
//            rf2.setValue(polygon.getMark());
//            rd.addField(rf2);
//
//            RecordField rf3 = new RecordField();
//            rf3.setName("措施名称");
//            rf3.setValue(polygon.getName());
//            rd.addField(rf3);
//
//            RecordField rf4 = new RecordField();
//            rf4.setName("利用现状");
//            rf4.setValue(polygon.getState());
//            rd.addField(rf4);
//
//            RecordField rf5 = new RecordField();
//            rf5.setName("措施数量");
//            rf5.setValue(polygon.getNumber().toString());
//            rd.addField(rf5);
//
//            RecordField rf6 = new RecordField();
//            rf6.setName("坡度");
//            rf6.setValue(polygon.getSlope().toString());
//            rd.addField(rf6);
//
//            ShapeObject so = new ShapeObject(5);
//            so.setRecord(rd);
//
//            CoordinateUitls.WGS84ToAlbers(polygon.getCoordinate());
//            GeometryJSON geometryJSON2 = new GeometryJSON(15);//?15
//            Geometry geometry = geometryJSON2.read(new StringReader(polygon.getCoordinate()));
//
//            org.locationtech.jts.geom.Coordinate[] coords = geometry.getCoordinates();
//            for (int i = 0; i < coords.length; i++) {
//                Point pt0 = new Point(coords[i].x, coords[i].y);
//                so.addPoint(pt0);
//            }
//            sf.addShapeObject(so);
//        }

        String writePath = "D:\\test\\testShp";
        sf.write(writePath);//创建shx shp dbf
        System.out.println("写入成功");
    }

}
